package com.lili.divide;

/**
 * @Auther: 李 力
 * @Date: 2024/8/20
 * @Description: 至少有 K 个重复字符的最长子串
 * @version: 1.0
 */
public class LeetCode395 {
    /*
     * 统计字符串中每个字符的出现次数，移除哪些出现次数 < k 的字符
       剩余的子串，递归做此处理，直至
       - 整个子串长度 < k (排除)
       - 子串中没有出现次数 < k 的字符
     *
     * */
    public static int longestSubstring(String s, int k) {
        if (s.length() < k) {
            return 0;
        }
        //索引对应字符，值为次数
        int[] counts = new int[26];
        char[] charArray = s.toCharArray();
        for (char c : charArray) {
            //'a'->0
            counts[c - 'a']++;
        }
        for (int i = 0; i < charArray.length; i++) {
            char c = charArray[i];
            int count = counts[c - 'a'];
            if (count > 0 && count < k) {
                int j = i + 1;
                while (j < s.length() && counts[charArray[j] - 'a'] < k) {
                    j++;
                }
                int a = longestSubstring(s.substring(0, i), k);
                int b = longestSubstring(s.substring(j), k);
                return Math.max(a, b);
            }
        }
        return s.length();
    }
}
